Основная цель и задачи проекта - подготовить исследование рынка общественного питания Москвы, найти интересные особенности и презентовать полученные результаты
Ход исследования:
На первоначальном этапе будут загружены и изучены данные из датасета '/datasets/moscow_places.csv'. В дальнейшем будет выполнена проверка на дубликаты, пропуски. Для целей анализа будут добавлены столбцы 'street' и 'is_24_7'.
В ходе анализа данных будут проведены исследования объектов общественного питания, количество посадочных мест, соотношения сетевых и несетевых заведений, рейтинги, средние чеки. Также будут изучены ТОП-15 улиц по количеству заведений и ТОП-15 сетевых заведений. Для визуализации исследования будут использованы графики, гистограммы, диаграммы, картограммы.
В заключительной части детализируем исследование: изучим возможности открытия кофейни. Будет проанализировано количество кофеен по округам, их рейтинги, время работы. В общем выводе будут даны рекомендации по открытию кофейни в Москве.
План работы:
import pandas as pd
import datetime as dt
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
from plotly import graph_objects as go
from pandas.plotting import register_matplotlib_converters
import warnings
import scipy.stats as stats
path = '/Users/andreyakimushkin/Downloads/'
data = pd.read_csv(path + 'moscow_places.csv')
#Выведем основную информацию о датафрейме методом info
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 8406 entries, 0 to 8405 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 8406 non-null object 1 category 8406 non-null object 2 address 8406 non-null object 3 district 8406 non-null object 4 hours 7870 non-null object 5 lat 8406 non-null float64 6 lng 8406 non-null float64 7 rating 8406 non-null float64 8 price 3315 non-null object 9 avg_bill 3816 non-null object 10 middle_avg_bill 3149 non-null float64 11 middle_coffee_cup 535 non-null float64 12 chain 8406 non-null int64 13 seats 4795 non-null float64 dtypes: float64(6), int64(1), object(7) memory usage: 919.5+ KB
#Ознакомимся с данными
data.head(20)
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WoWфли | кафе | Москва, улица Дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1 | Четыре комнаты | ресторан | Москва, улица Дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | 0 | 4.0 |
| 2 | Хазри | кафе | Москва, Клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | 0 | 45.0 |
| 3 | Dormouse Coffee Shop | кофейня | Москва, улица Маршала Федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | NaN | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN |
| 4 | Иль Марко | пиццерия | Москва, Правобережная улица, 1Б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | 1 | 148.0 |
| 5 | Sergio Pizza | пиццерия | Москва, Ижорская улица, вл8Б | Северный административный округ | ежедневно, 10:00–23:00 | 55.888010 | 37.509573 | 4.6 | средние | NaN | NaN | NaN | 0 | NaN |
| 6 | Огни города | бар,паб | Москва, Клязьминская улица, 9, стр. 3 | Северный административный округ | пн 15:00–04:00; вт-вс 15:00–05:00 | 55.890752 | 37.524653 | 4.4 | средние | Средний счёт:199 ₽ | 199.0 | NaN | 0 | 45.0 |
| 7 | Mr. Уголёк | быстрое питание | Москва, Клязьминская улица, 9, стр. 3 | Северный административный округ | пн-чт 10:00–22:00; пт,сб 10:00–23:00; вс 10:00... | 55.890636 | 37.524303 | 4.7 | средние | Средний счёт:200–300 ₽ | 250.0 | NaN | 0 | 45.0 |
| 8 | Donna Maria | ресторан | Москва, Дмитровское шоссе, 107, корп. 4 | Северный административный округ | ежедневно, 10:00–22:00 | 55.880045 | 37.539006 | 4.8 | средние | Средний счёт:от 500 ₽ | 500.0 | NaN | 0 | 79.0 |
| 9 | Готика | кафе | Москва, Ангарская улица, 39 | Северный административный округ | ежедневно, 12:00–00:00 | 55.879038 | 37.524487 | 4.3 | средние | Средний счёт:1000–1200 ₽ | 1100.0 | NaN | 0 | 65.0 |
| 10 | Great Room Bar | бар,паб | Москва, Левобережная улица, 12 | Северный административный округ | ежедневно, круглосуточно | 55.877832 | 37.469171 | 4.5 | средние | Цена бокала пива:250–350 ₽ | NaN | NaN | 0 | 102.0 |
| 11 | Шашлык Шефф | кафе | Москва, улица Маршала Федоренко, 10с1 | Северный административный округ | ежедневно, 10:00–21:00 | 55.881770 | 37.492362 | 4.9 | NaN | NaN | NaN | NaN | 0 | NaN |
| 12 | Заправка | кафе | Москва, МКАД, 80-й километр, 1 | Северный административный округ | вт-сб 09:00–18:00 | 55.899938 | 37.517958 | 4.3 | средние | Средний счёт:330 ₽ | 330.0 | NaN | 0 | NaN |
| 13 | Буханка | булочная | Москва, Базовская улица, 15, корп. 1 | Северный административный округ | ежедневно, 08:00–22:00 | 55.877007 | 37.504980 | 4.8 | NaN | NaN | NaN | NaN | 1 | 180.0 |
| 14 | У Сильвы | бар,паб | Москва, Ангарская улица, 42с1 | Северный административный округ | ежедневно, 13:00–00:00 | 55.885528 | 37.528371 | 4.2 | выше среднего | Средний счёт:1500 ₽ | 1500.0 | NaN | 0 | NaN |
| 15 | Дом обеда | столовая | Москва, улица Бусиновская Горка, 2 | Северный административный округ | пн-пт 08:30–18:30; сб 10:00–20:00 | 55.885890 | 37.493264 | 4.1 | средние | Средний счёт:300–500 ₽ | 400.0 | NaN | 0 | 180.0 |
| 16 | База Стритфуд | кафе | Москва, Базовская улица, 15, корп. 8 | Северный административный округ | ежедневно, 10:00–23:00 | 55.877859 | 37.507754 | 4.2 | средние | Средний счёт:140–350 ₽ | 245.0 | NaN | 0 | NaN |
| 17 | Чайхана Беш-Бармак | ресторан | Москва, Ленинградское шоссе, 71Б, стр. 2 | Северный административный округ | ежедневно, круглосуточно | 55.876908 | 37.449876 | 4.4 | средние | Средний счёт:350–500 ₽ | 425.0 | NaN | 0 | 96.0 |
| 18 | Час-Пик | столовая | Москва, Коровинское шоссе, 30А | Северный административный округ | ежедневно, 09:00–21:00 | 55.884651 | 37.517482 | 4.3 | средние | Средний счёт:200–300 ₽ | 250.0 | NaN | 0 | 25.0 |
| 19 | Пекарня | булочная | Москва, Ижорский проезд, 5 | Северный административный округ | ежедневно, круглосуточно | 55.887969 | 37.515688 | 4.4 | NaN | NaN | NaN | NaN | 1 | NaN |
#Посчитаем количество уникальных заведений в датафрейме
data['name'].nunique()
5614
Вывод: В датафрейме представлено 14 столбцов. Общее количество строк, представленных в таблице равно 8406. Число уникальных наименований заведений - 5614 (помним, что сетевые заведения имеют неуникальные наименования). 7 столбцов хранят данные типа object, 6 тип float и 1 тип int. Ряд столбцов содержат пропуски. Далее более подробно рассмотрим какие столбцы содержат пропуски и с чем это может быть связано.
#проверим данные на явные дубликаты
data.duplicated().sum()
0
#проверим данные на дубликаты по нескольким столбцам одновременно
data['name'] = data['name'].str.lower()
data['address'] = data['address'].str.lower()
data[data.duplicated(['name','address'])]
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 215 | кафе | кафе | москва, парк ангарские пруды | Северный административный округ | ежедневно, 10:00–22:00 | 55.881438 | 37.531848 | 3.2 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1511 | more poke | ресторан | москва, волоколамское шоссе, 11, стр. 2 | Северный административный округ | пн-чт 09:00–18:00; пт,сб 09:00–21:00; вс 09:00... | 55.806307 | 37.497566 | 4.2 | NaN | NaN | NaN | NaN | 1 | 188.0 |
| 2420 | раковарня клешни и хвосты | бар,паб | москва, проспект мира, 118 | Северо-Восточный административный округ | пн-чт 12:00–00:00; пт,сб 12:00–01:00; вс 12:00... | 55.810677 | 37.638379 | 4.4 | NaN | NaN | NaN | NaN | 1 | 150.0 |
| 3109 | хлеб да выпечка | кафе | москва, ярцевская улица, 19 | Западный административный округ | NaN | 55.738449 | 37.410937 | 4.1 | NaN | NaN | NaN | NaN | 0 | 276.0 |
#Удалим дубликаты
data = data.drop_duplicates(subset=['name', 'address']).reset_index(drop=True)
data[data.duplicated(['name','address'])]
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats |
|---|
Вывод: Теперь дубликатов в таблице нет.
#Выведем количество пропущенных значений для каждого столбца
data.isna().sum()
name 0 category 0 address 0 district 0 hours 535 lat 0 lng 0 rating 0 price 5087 avg_bill 4586 middle_avg_bill 5253 middle_coffee_cup 7867 chain 0 seats 3610 dtype: int64
Вывод: Довольно большое количество пропусков в датафрейме. В частности, в столбцах hours, price, avg_bill, middle_avg_bill, middle_coffee_cup, seats.
#В столбце price содержатся текстовые категориальные данные, которые определяются величиной среднего чека. Изучим эти данные
data['price'].sort_values().unique()
array(['высокие', 'выше среднего', 'низкие', 'средние', nan], dtype=object)
#Рассмотрим все категории представленные в таблице
category_price = (
data.groupby(['category', 'price'])
.agg({'middle_avg_bill': 'mean'})
)
category_price
| middle_avg_bill | ||
|---|---|---|
| category | price | |
| бар,паб | высокие | 2285.555556 |
| выше среднего | 1354.009901 | |
| низкие | 170.000000 | |
| средние | 794.958042 | |
| булочная | высокие | 2250.000000 |
| выше среднего | 1050.000000 | |
| низкие | 166.666667 | |
| средние | 498.571429 | |
| быстрое питание | высокие | 3816.666667 |
| выше среднего | 1300.000000 | |
| низкие | 156.857143 | |
| средние | 429.953642 | |
| кафе | высокие | 2133.333333 |
| выше среднего | 1302.739726 | |
| низкие | 207.692308 | |
| средние | 585.574786 | |
| кофейня | высокие | 1814.705882 |
| выше среднего | 1310.000000 | |
| низкие | 173.250000 | |
| средние | 484.340741 | |
| пиццерия | высокие | 2077.241379 |
| выше среднего | 1348.571429 | |
| низкие | 225.000000 | |
| средние | 679.200000 | |
| ресторан | высокие | 2646.183206 |
| выше среднего | 1359.325397 | |
| низкие | 324.761905 | |
| средние | 709.348449 | |
| столовая | высокие | 3750.000000 |
| выше среднего | 1225.000000 | |
| низкие | 202.000000 | |
| средние | 317.359712 |
Вывод: категорию price можно было бы заполнить на основе данных category и middle_avg_bill, однако анализ представленного датафрейма показал, что отсутствие данных в столбце middle_avg_bill преимущественно ведет к NaN в category. Заменим NaN на "нет категории"
data['price'] = data['price'].fillna('нет категории')
#проверка на наличие пропуска
data['price'].isna().sum()
0
#столбцы avg_bill и middle_avg_bill связаны между собой. Посмотрим что за текстовые значения у нас содержатся в столбце avg_bill
data['avg_bill'].sort_values().unique()
array(['Средний счёт:100 ₽', 'Средний счёт:1000 ₽',
'Средний счёт:1000–10000 ₽', 'Средний счёт:1000–1100 ₽',
'Средний счёт:1000–1200 ₽', 'Средний счёт:1000–1300 ₽',
'Средний счёт:1000–1350 ₽', 'Средний счёт:1000–1400 ₽',
'Средний счёт:1000–1500 ₽', 'Средний счёт:1000–1600 ₽',
'Средний счёт:1000–1700 ₽', 'Средний счёт:1000–2000 ₽',
'Средний счёт:1000–2500 ₽', 'Средний счёт:1000–3000 ₽',
'Средний счёт:1000–5000 ₽', 'Средний счёт:100–1000 ₽',
'Средний счёт:100–160 ₽', 'Средний счёт:100–180 ₽',
'Средний счёт:100–200 ₽', 'Средний счёт:100–2000 ₽',
'Средний счёт:100–270 ₽', 'Средний счёт:100–300 ₽',
'Средний счёт:100–330 ₽', 'Средний счёт:100–350 ₽',
'Средний счёт:100–400 ₽', 'Средний счёт:100–423 ₽',
'Средний счёт:100–500 ₽', 'Средний счёт:100–599 ₽',
'Средний счёт:100–700 ₽', 'Средний счёт:1100–1500 ₽',
'Средний счёт:110–200 ₽', 'Средний счёт:120 ₽',
'Средний счёт:1200 ₽', 'Средний счёт:1200–1300 ₽',
'Средний счёт:1200–1500 ₽', 'Средний счёт:1200–1600 ₽',
'Средний счёт:1200–1700 ₽', 'Средний счёт:1200–1800 ₽',
'Средний счёт:1200–1900 ₽', 'Средний счёт:1200–2000 ₽',
'Средний счёт:1200–2500 ₽', 'Средний счёт:1200–3000 ₽',
'Средний счёт:120–130 ₽', 'Средний счёт:120–150 ₽',
'Средний счёт:120–160 ₽', 'Средний счёт:120–370 ₽',
'Средний счёт:120–470 ₽', 'Средний счёт:1300 ₽',
'Средний счёт:1300–1500 ₽', 'Средний счёт:1300–1600 ₽',
'Средний счёт:1300–1700 ₽', 'Средний счёт:1300–1800 ₽',
'Средний счёт:1300–2000 ₽', 'Средний счёт:1300–2100 ₽',
'Средний счёт:1300–2500 ₽', 'Средний счёт:130–140 ₽',
'Средний счёт:130–200 ₽', 'Средний счёт:130–350 ₽',
'Средний счёт:130–700 ₽', 'Средний счёт:1330 ₽',
'Средний счёт:1400 ₽', 'Средний счёт:1400–1500 ₽',
'Средний счёт:1400–1600 ₽', 'Средний счёт:1400–1700 ₽',
'Средний счёт:1400–1800 ₽', 'Средний счёт:140–142 ₽',
'Средний счёт:140–160 ₽', 'Средний счёт:140–250 ₽',
'Средний счёт:140–350 ₽', 'Средний счёт:149–249 ₽',
'Средний счёт:150 ₽', 'Средний счёт:1500 ₽',
'Средний счёт:1500–1600 ₽', 'Средний счёт:1500–1700 ₽',
'Средний счёт:1500–1800 ₽', 'Средний счёт:1500–1880 ₽',
'Средний счёт:1500–1900 ₽', 'Средний счёт:1500–2000 ₽',
'Средний счёт:1500–2500 ₽', 'Средний счёт:1500–3000 ₽',
'Средний счёт:1500–3500 ₽', 'Средний счёт:1500–4000 ₽',
'Средний счёт:1500–5000 ₽', 'Средний счёт:150–1000 ₽',
'Средний счёт:150–180 ₽', 'Средний счёт:150–200 ₽',
'Средний счёт:150–220 ₽', 'Средний счёт:150–250 ₽',
'Средний счёт:150–260 ₽', 'Средний счёт:150–300 ₽',
'Средний счёт:150–350 ₽', 'Средний счёт:150–400 ₽',
'Средний счёт:150–450 ₽', 'Средний счёт:150–500 ₽',
'Средний счёт:150–599 ₽', 'Средний счёт:150–600 ₽',
'Средний счёт:150–650 ₽', 'Средний счёт:150–700 ₽',
'Средний счёт:1600 ₽', 'Средний счёт:160–200 ₽',
'Средний счёт:160–240 ₽', 'Средний счёт:160–250 ₽',
'Средний счёт:160–500 ₽', 'Средний счёт:170 ₽',
'Средний счёт:1700 ₽', 'Средний счёт:1700–1900 ₽',
'Средний счёт:1700–2500 ₽', 'Средний счёт:170–220 ₽',
'Средний счёт:170–230 ₽', 'Средний счёт:170–280 ₽',
'Средний счёт:170–300 ₽', 'Средний счёт:170–350 ₽',
'Средний счёт:170–490 ₽', 'Средний счёт:170–700 ₽',
'Средний счёт:180 ₽', 'Средний счёт:1800 ₽',
'Средний счёт:1800–2000 ₽', 'Средний счёт:1800–2500 ₽',
'Средний счёт:180–1170 ₽', 'Средний счёт:180–220 ₽',
'Средний счёт:180–280 ₽', 'Средний счёт:180–350 ₽',
'Средний счёт:190 ₽', 'Средний счёт:1900 ₽',
'Средний счёт:1900–2500 ₽', 'Средний счёт:190–260 ₽',
'Средний счёт:190–280 ₽', 'Средний счёт:190–290 ₽',
'Средний счёт:190–350 ₽', 'Средний счёт:195–235 ₽',
'Средний счёт:199 ₽', 'Средний счёт:199–450 ₽',
'Средний счёт:1–2000 ₽', 'Средний счёт:200 ₽',
'Средний счёт:2000 ₽', 'Средний счёт:20000–50000 ₽',
'Средний счёт:2000–2500 ₽', 'Средний счёт:2000–3000 ₽',
'Средний счёт:2000–3500 ₽', 'Средний счёт:2000–4000 ₽',
'Средний счёт:2000–5000 ₽', 'Средний счёт:200–1000 ₽',
'Средний счёт:200–220 ₽', 'Средний счёт:200–250 ₽',
'Средний счёт:200–270 ₽', 'Средний счёт:200–280 ₽',
'Средний счёт:200–300 ₽', 'Средний счёт:200–350 ₽',
'Средний счёт:200–360 ₽', 'Средний счёт:200–400 ₽',
'Средний счёт:200–450 ₽', 'Средний счёт:200–500 ₽',
'Средний счёт:200–600 ₽', 'Средний счёт:200–700 ₽',
'Средний счёт:205–500 ₽', 'Средний счёт:2100 ₽',
'Средний счёт:220 ₽', 'Средний счёт:2200 ₽',
'Средний счёт:220–270 ₽', 'Средний счёт:220–300 ₽',
'Средний счёт:220–350 ₽', 'Средний счёт:220–500 ₽',
'Средний счёт:229 ₽', 'Средний счёт:2300 ₽',
'Средний счёт:230–250 ₽', 'Средний счёт:230–280 ₽',
'Средний счёт:230–300 ₽', 'Средний счёт:230–350 ₽',
'Средний счёт:230–500 ₽', 'Средний счёт:230–650 ₽',
'Средний счёт:232–387 ₽', 'Средний счёт:240 ₽',
'Средний счёт:2400 ₽', 'Средний счёт:240–350 ₽',
'Средний счёт:240–360 ₽', 'Средний счёт:240–500 ₽',
'Средний счёт:250 ₽', 'Средний счёт:2500 ₽',
'Средний счёт:2500–3000 ₽', 'Средний счёт:2500–3500 ₽',
'Средний счёт:2500–4000 ₽', 'Средний счёт:2500–4500 ₽',
'Средний счёт:2500–5000 ₽', 'Средний счёт:250–1000 ₽',
'Средний счёт:250–270 ₽', 'Средний счёт:250–280 ₽',
'Средний счёт:250–300 ₽', 'Средний счёт:250–320 ₽',
'Средний счёт:250–350 ₽', 'Средний счёт:250–380 ₽',
'Средний счёт:250–400 ₽', 'Средний счёт:250–430 ₽',
'Средний счёт:250–450 ₽', 'Средний счёт:250–480 ₽',
'Средний счёт:250–500 ₽', 'Средний счёт:250–550 ₽',
'Средний счёт:250–600 ₽', 'Средний счёт:250–700 ₽',
'Средний счёт:250–800 ₽', 'Средний счёт:260 ₽',
'Средний счёт:2600 ₽', 'Средний счёт:260–1000 ₽',
'Средний счёт:260–280 ₽', 'Средний счёт:260–290 ₽',
'Средний счёт:260–300 ₽', 'Средний счёт:260–400 ₽',
'Средний счёт:266 ₽', 'Средний счёт:269 ₽', 'Средний счёт:270 ₽',
'Средний счёт:270–300 ₽', 'Средний счёт:270–350 ₽',
'Средний счёт:270–400 ₽', 'Средний счёт:270–450 ₽',
'Средний счёт:275 ₽', 'Средний счёт:275–500 ₽',
'Средний счёт:280 ₽', 'Средний счёт:280–290 ₽',
'Средний счёт:280–320 ₽', 'Средний счёт:280–330 ₽',
'Средний счёт:280–350 ₽', 'Средний счёт:280–360 ₽',
'Средний счёт:280–400 ₽', 'Средний счёт:280–420 ₽',
'Средний счёт:280–450 ₽', 'Средний счёт:285 ₽',
'Средний счёт:290 ₽', 'Средний счёт:2900 ₽',
'Средний счёт:290–490 ₽', 'Средний счёт:290–500 ₽',
'Средний счёт:291 ₽', 'Средний счёт:298 ₽', 'Средний счёт:299 ₽',
'Средний счёт:299–400 ₽', 'Средний счёт:299–450 ₽',
'Средний счёт:300 ₽', 'Средний счёт:3000 ₽',
'Средний счёт:3000–3500 ₽', 'Средний счёт:3000–4000 ₽',
'Средний счёт:3000–5000 ₽', 'Средний счёт:300–1000 ₽',
'Средний счёт:300–1500 ₽', 'Средний счёт:300–1600 ₽',
'Средний счёт:300–2000 ₽', 'Средний счёт:300–350 ₽',
'Средний счёт:300–400 ₽', 'Средний счёт:300–420 ₽',
'Средний счёт:300–430 ₽', 'Средний счёт:300–450 ₽',
'Средний счёт:300–500 ₽', 'Средний счёт:300–550 ₽',
'Средний счёт:300–600 ₽', 'Средний счёт:300–650 ₽',
'Средний счёт:300–700 ₽', 'Средний счёт:300–800 ₽',
'Средний счёт:301 ₽', 'Средний счёт:304 ₽',
'Средний счёт:30–300 ₽', 'Средний счёт:310–370 ₽',
'Средний счёт:313 ₽', 'Средний счёт:317 ₽', 'Средний счёт:320 ₽',
'Средний счёт:320–1500 ₽', 'Средний счёт:320–350 ₽',
'Средний счёт:320–480 ₽', 'Средний счёт:321 ₽',
'Средний счёт:324 ₽', 'Средний счёт:328 ₽', 'Средний счёт:330 ₽',
'Средний счёт:330–400 ₽', 'Средний счёт:330–990 ₽',
'Средний счёт:339 ₽', 'Средний счёт:340 ₽',
'Средний счёт:340–550 ₽', 'Средний счёт:343 ₽',
'Средний счёт:344 ₽', 'Средний счёт:349 ₽', 'Средний счёт:350 ₽',
'Средний счёт:3500 ₽', 'Средний счёт:3500–4000 ₽',
'Средний счёт:3500–5000 ₽', 'Средний счёт:350–1000 ₽',
'Средний счёт:350–1500 ₽', 'Средний счёт:350–2000 ₽',
'Средний счёт:350–2400 ₽', 'Средний счёт:350–400 ₽',
'Средний счёт:350–420 ₽', 'Средний счёт:350–450 ₽',
'Средний счёт:350–500 ₽', 'Средний счёт:350–550 ₽',
'Средний счёт:350–600 ₽', 'Средний счёт:350–650 ₽',
'Средний счёт:350–700 ₽', 'Средний счёт:350–800 ₽',
'Средний счёт:355 ₽', 'Средний счёт:35–100 ₽',
'Средний счёт:35–180 ₽', 'Средний счёт:35–300 ₽',
'Средний счёт:360 ₽', 'Средний счёт:360–500 ₽',
'Средний счёт:360–540 ₽', 'Средний счёт:362 ₽',
'Средний счёт:363 ₽', 'Средний счёт:366 ₽', 'Средний счёт:370 ₽',
'Средний счёт:372 ₽', 'Средний счёт:373 ₽', 'Средний счёт:375 ₽',
'Средний счёт:380–1010 ₽', 'Средний счёт:380–400 ₽',
'Средний счёт:380–500 ₽', 'Средний счёт:380–600 ₽',
'Средний счёт:382 ₽', 'Средний счёт:383 ₽', 'Средний счёт:385 ₽',
'Средний счёт:385–580 ₽', 'Средний счёт:390–1000 ₽',
'Средний счёт:390–460 ₽', 'Средний счёт:390–500 ₽',
'Средний счёт:390–660 ₽', 'Средний счёт:390–700 ₽',
'Средний счёт:391 ₽', 'Средний счёт:392 ₽', 'Средний счёт:400 ₽',
'Средний счёт:4000 ₽', 'Средний счёт:4000–5000 ₽',
'Средний счёт:400–1000 ₽', 'Средний счёт:400–1200 ₽',
'Средний счёт:400–1500 ₽', 'Средний счёт:400–2500 ₽',
'Средний счёт:400–450 ₽', 'Средний счёт:400–500 ₽',
'Средний счёт:400–550 ₽', 'Средний счёт:400–600 ₽',
'Средний счёт:400–6000 ₽', 'Средний счёт:400–650 ₽',
'Средний счёт:400–700 ₽', 'Средний счёт:400–800 ₽',
'Средний счёт:400–900 ₽', 'Средний счёт:402 ₽',
'Средний счёт:404 ₽', 'Средний счёт:407 ₽', 'Средний счёт:410 ₽',
'Средний счёт:411 ₽', 'Средний счёт:412 ₽', 'Средний счёт:413 ₽',
'Средний счёт:415 ₽', 'Средний счёт:416 ₽',
'Средний счёт:420–680 ₽', 'Средний счёт:422 ₽',
'Средний счёт:426 ₽', 'Средний счёт:430 ₽', 'Средний счёт:432 ₽',
'Средний счёт:433 ₽', 'Средний счёт:434 ₽', 'Средний счёт:435 ₽',
'Средний счёт:438 ₽', 'Средний счёт:439 ₽', 'Средний счёт:441 ₽',
'Средний счёт:443 ₽', 'Средний счёт:450 ₽',
'Средний счёт:4500–5000 ₽', 'Средний счёт:4500–5500 ₽',
'Средний счёт:450–500 ₽', 'Средний счёт:450–550 ₽',
'Средний счёт:450–600 ₽', 'Средний счёт:450–650 ₽',
'Средний счёт:450–700 ₽', 'Средний счёт:450–750 ₽',
'Средний счёт:450–800 ₽', 'Средний счёт:450–900 ₽',
'Средний счёт:453 ₽', 'Средний счёт:465 ₽', 'Средний счёт:470 ₽',
'Средний счёт:472 ₽', 'Средний счёт:475 ₽', 'Средний счёт:480 ₽',
'Средний счёт:495 ₽', 'Средний счёт:499–700 ₽',
'Средний счёт:49–369 ₽', 'Средний счёт:50 ₽', 'Средний счёт:500 ₽',
'Средний счёт:5000 ₽', 'Средний счёт:5000–15000 ₽',
'Средний счёт:5000–17000 ₽', 'Средний счёт:5000–5500 ₽',
'Средний счёт:5000–8000 ₽', 'Средний счёт:500–1000 ₽',
'Средний счёт:500–1050 ₽', 'Средний счёт:500–1100 ₽',
'Средний счёт:500–1200 ₽', 'Средний счёт:500–1300 ₽',
'Средний счёт:500–1500 ₽', 'Средний счёт:500–2000 ₽',
'Средний счёт:500–2500 ₽', 'Средний счёт:500–3000 ₽',
'Средний счёт:500–5000 ₽', 'Средний счёт:500–520 ₽',
'Средний счёт:500–550 ₽', 'Средний счёт:500–600 ₽',
'Средний счёт:500–650 ₽', 'Средний счёт:500–700 ₽',
'Средний счёт:500–750 ₽', 'Средний счёт:500–800 ₽',
'Средний счёт:500–900 ₽', 'Средний счёт:503 ₽',
'Средний счёт:508 ₽', 'Средний счёт:50–200 ₽',
'Средний счёт:50–250 ₽', 'Средний счёт:50–300 ₽',
'Средний счёт:520–1200 ₽', 'Средний счёт:520–600 ₽',
'Средний счёт:550 ₽', 'Средний счёт:5500 ₽',
'Средний счёт:550–1300 ₽', 'Средний счёт:550–1500 ₽',
'Средний счёт:550–1550 ₽', 'Средний счёт:550–700 ₽',
'Средний счёт:550–750 ₽', 'Средний счёт:590–1490 ₽',
'Средний счёт:600 ₽', 'Средний счёт:6000 ₽',
'Средний счёт:6000–8000 ₽', 'Средний счёт:600–1000 ₽',
'Средний счёт:600–1200 ₽', 'Средний счёт:600–1300 ₽',
'Средний счёт:600–1500 ₽', 'Средний счёт:600–2000 ₽',
'Средний счёт:600–700 ₽', 'Средний счёт:600–750 ₽',
'Средний счёт:600–800 ₽', 'Средний счёт:600–900 ₽',
'Средний счёт:600–950 ₽', 'Средний счёт:60–140 ₽',
'Средний счёт:60–180 ₽', 'Средний счёт:60–400 ₽',
'Средний счёт:620 ₽', 'Средний счёт:650 ₽',
'Средний счёт:650–1000 ₽', 'Средний счёт:650–2000 ₽',
'Средний счёт:650–800 ₽', 'Средний счёт:650–850 ₽',
'Средний счёт:670 ₽', 'Средний счёт:69–499 ₽',
'Средний счёт:700 ₽', 'Средний счёт:7000 ₽',
'Средний счёт:7000–7500 ₽', 'Средний счёт:700–1000 ₽',
'Средний счёт:700–1100 ₽', 'Средний счёт:700–1200 ₽',
'Средний счёт:700–1300 ₽', 'Средний счёт:700–1400 ₽',
'Средний счёт:700–1500 ₽', 'Средний счёт:700–1800 ₽',
'Средний счёт:700–3000 ₽', 'Средний счёт:700–3500 ₽',
'Средний счёт:700–800 ₽', 'Средний счёт:700–850 ₽',
'Средний счёт:700–900 ₽', 'Средний счёт:70–150 ₽',
'Средний счёт:70–200 ₽', 'Средний счёт:750 ₽',
'Средний счёт:750–1000 ₽', 'Средний счёт:750–1200 ₽',
'Средний счёт:750–1500 ₽', 'Средний счёт:750–850 ₽',
'Средний счёт:750–900 ₽', 'Средний счёт:795–1325 ₽',
'Средний счёт:800 ₽', 'Средний счёт:800–1000 ₽',
'Средний счёт:800–1100 ₽', 'Средний счёт:800–1200 ₽',
'Средний счёт:800–1300 ₽', 'Средний счёт:800–1500 ₽',
'Средний счёт:800–1800 ₽', 'Средний счёт:800–2000 ₽',
'Средний счёт:800–3000 ₽', 'Средний счёт:80–220 ₽',
'Средний счёт:80–300 ₽', 'Средний счёт:80–340 ₽',
'Средний счёт:80–350 ₽', 'Средний счёт:850 ₽',
'Средний счёт:850–1000 ₽', 'Средний счёт:850–1100 ₽',
'Средний счёт:850–1200 ₽', 'Средний счёт:850–1500 ₽',
'Средний счёт:90 ₽', 'Средний счёт:900 ₽',
'Средний счёт:900–1000 ₽', 'Средний счёт:900–1100 ₽',
'Средний счёт:900–1150 ₽', 'Средний счёт:900–1200 ₽',
'Средний счёт:900–1400 ₽', 'Средний счёт:900–1500 ₽',
'Средний счёт:90–190 ₽', 'Средний счёт:90–230 ₽',
'Средний счёт:90–450 ₽', 'Средний счёт:950–1200 ₽',
'Средний счёт:950–1500 ₽', 'Средний счёт:99–500 ₽',
'Средний счёт:до 1000 ₽', 'Средний счёт:до 1500 ₽',
'Средний счёт:до 300 ₽', 'Средний счёт:до 350 ₽',
'Средний счёт:до 470 ₽', 'Средний счёт:до 500 ₽',
'Средний счёт:до 650 ₽', 'Средний счёт:от 0 ₽',
'Средний счёт:от 100 ₽', 'Средний счёт:от 1000 ₽',
'Средний счёт:от 1090 ₽', 'Средний счёт:от 120 ₽',
'Средний счёт:от 1200 ₽', 'Средний счёт:от 140 ₽',
'Средний счёт:от 1400 ₽', 'Средний счёт:от 150 ₽',
'Средний счёт:от 1500 ₽', 'Средний счёт:от 165 ₽',
'Средний счёт:от 175 ₽', 'Средний счёт:от 180 ₽',
'Средний счёт:от 1800 ₽', 'Средний счёт:от 199 ₽',
'Средний счёт:от 200 ₽', 'Средний счёт:от 2000 ₽',
'Средний счёт:от 230 ₽', 'Средний счёт:от 240 ₽',
'Средний счёт:от 250 ₽', 'Средний счёт:от 2500 ₽',
'Средний счёт:от 270 ₽', 'Средний счёт:от 30 ₽',
'Средний счёт:от 300 ₽', 'Средний счёт:от 3000 ₽',
'Средний счёт:от 320 ₽', 'Средний счёт:от 330 ₽',
'Средний счёт:от 340 ₽', 'Средний счёт:от 345 ₽',
'Средний счёт:от 350 ₽', 'Средний счёт:от 3500 ₽',
'Средний счёт:от 390 ₽', 'Средний счёт:от 399 ₽',
'Средний счёт:от 400 ₽', 'Средний счёт:от 4000 ₽',
'Средний счёт:от 420 ₽', 'Средний счёт:от 450 ₽',
'Средний счёт:от 470 ₽', 'Средний счёт:от 475 ₽',
'Средний счёт:от 499 ₽', 'Средний счёт:от 50 ₽',
'Средний счёт:от 500 ₽', 'Средний счёт:от 5000 ₽',
'Средний счёт:от 549 ₽', 'Средний счёт:от 600 ₽',
'Средний счёт:от 650 ₽', 'Средний счёт:от 700 ₽',
'Средний счёт:от 800 ₽', 'Средний счёт:от 850 ₽',
'Цена бокала пива:100–250 ₽', 'Цена бокала пива:120–350 ₽',
'Цена бокала пива:129–319 ₽', 'Цена бокала пива:130–150 ₽',
'Цена бокала пива:140–190 ₽', 'Цена бокала пива:140–330 ₽',
'Цена бокала пива:140–420 ₽', 'Цена бокала пива:150 ₽',
'Цена бокала пива:150–180 ₽', 'Цена бокала пива:150–230 ₽',
'Цена бокала пива:150–250 ₽', 'Цена бокала пива:150–290 ₽',
'Цена бокала пива:150–350 ₽', 'Цена бокала пива:150–450 ₽',
'Цена бокала пива:155–465 ₽', 'Цена бокала пива:160–350 ₽',
'Цена бокала пива:160–390 ₽', 'Цена бокала пива:160–499 ₽',
'Цена бокала пива:170–200 ₽', 'Цена бокала пива:170–240 ₽',
'Цена бокала пива:170–320 ₽', 'Цена бокала пива:170–380 ₽',
'Цена бокала пива:180–260 ₽', 'Цена бокала пива:180–330 ₽',
'Цена бокала пива:180–380 ₽', 'Цена бокала пива:180–400 ₽',
'Цена бокала пива:180–420 ₽', 'Цена бокала пива:180–480 ₽',
'Цена бокала пива:190–350 ₽', 'Цена бокала пива:190–390 ₽',
'Цена бокала пива:190–430 ₽', 'Цена бокала пива:190–450 ₽',
'Цена бокала пива:190–500 ₽', 'Цена бокала пива:199–300 ₽',
'Цена бокала пива:199–459 ₽', 'Цена бокала пива:200 ₽',
'Цена бокала пива:200–1100 ₽', 'Цена бокала пива:200–240 ₽',
'Цена бокала пива:200–300 ₽', 'Цена бокала пива:200–320 ₽',
'Цена бокала пива:200–350 ₽', 'Цена бокала пива:200–380 ₽',
'Цена бокала пива:200–390 ₽', 'Цена бокала пива:200–440 ₽',
'Цена бокала пива:220–250 ₽', 'Цена бокала пива:220–350 ₽',
'Цена бокала пива:220–390 ₽', 'Цена бокала пива:220–440 ₽',
'Цена бокала пива:220–450 ₽', 'Цена бокала пива:220–500 ₽',
'Цена бокала пива:220–550 ₽', 'Цена бокала пива:230 ₽',
'Цена бокала пива:230–350 ₽', 'Цена бокала пива:240–350 ₽',
'Цена бокала пива:240–380 ₽', 'Цена бокала пива:250–350 ₽',
'Цена бокала пива:250–390 ₽', 'Цена бокала пива:250–395 ₽',
'Цена бокала пива:250–400 ₽', 'Цена бокала пива:250–450 ₽',
'Цена бокала пива:250–490 ₽', 'Цена бокала пива:250–550 ₽',
'Цена бокала пива:260–360 ₽', 'Цена бокала пива:260–380 ₽',
'Цена бокала пива:260–400 ₽', 'Цена бокала пива:270–1100 ₽',
'Цена бокала пива:270–390 ₽', 'Цена бокала пива:270–490 ₽',
'Цена бокала пива:280 ₽', 'Цена бокала пива:280–360 ₽',
'Цена бокала пива:280–400 ₽', 'Цена бокала пива:280–410 ₽',
'Цена бокала пива:290–390 ₽', 'Цена бокала пива:290–440 ₽',
'Цена бокала пива:300 ₽', 'Цена бокала пива:300–400 ₽',
'Цена бокала пива:300–420 ₽', 'Цена бокала пива:300–475 ₽',
'Цена бокала пива:300–500 ₽', 'Цена бокала пива:300–600 ₽',
'Цена бокала пива:320–375 ₽', 'Цена бокала пива:320–380 ₽',
'Цена бокала пива:320–440 ₽', 'Цена бокала пива:320–460 ₽',
'Цена бокала пива:320–470 ₽', 'Цена бокала пива:330–490 ₽',
'Цена бокала пива:340 ₽', 'Цена бокала пива:340–420 ₽',
'Цена бокала пива:350 ₽', 'Цена бокала пива:350–370 ₽',
'Цена бокала пива:350–400 ₽', 'Цена бокала пива:350–500 ₽',
'Цена бокала пива:360 ₽', 'Цена бокала пива:370–410 ₽',
'Цена бокала пива:370–420 ₽', 'Цена бокала пива:380–400 ₽',
'Цена бокала пива:390 ₽', 'Цена бокала пива:390–530 ₽',
'Цена бокала пива:390–590 ₽', 'Цена бокала пива:39–190 ₽',
'Цена бокала пива:420–640 ₽', 'Цена бокала пива:88–460 ₽',
'Цена бокала пива:90–230 ₽', 'Цена бокала пива:90–250 ₽',
'Цена бокала пива:до 350 ₽', 'Цена бокала пива:от 100 ₽',
'Цена бокала пива:от 140 ₽', 'Цена бокала пива:от 149 ₽',
'Цена бокала пива:от 195 ₽', 'Цена бокала пива:от 200 ₽',
'Цена бокала пива:от 350 ₽', 'Цена чашки капучино:100 ₽',
'Цена чашки капучино:100–120 ₽', 'Цена чашки капучино:100–140 ₽',
'Цена чашки капучино:100–150 ₽', 'Цена чашки капучино:100–160 ₽',
'Цена чашки капучино:100–170 ₽', 'Цена чашки капучино:100–179 ₽',
'Цена чашки капучино:100–180 ₽', 'Цена чашки капучино:100–200 ₽',
'Цена чашки капучино:100–210 ₽', 'Цена чашки капучино:100–220 ₽',
'Цена чашки капучино:105–145 ₽', 'Цена чашки капучино:109–169 ₽',
'Цена чашки капучино:110 ₽', 'Цена чашки капучино:110–150 ₽',
'Цена чашки капучино:110–160 ₽', 'Цена чашки капучино:110–165 ₽',
'Цена чашки капучино:110–170 ₽', 'Цена чашки капучино:110–190 ₽',
'Цена чашки капучино:110–200 ₽', 'Цена чашки капучино:115–140 ₽',
'Цена чашки капучино:119–149 ₽', 'Цена чашки капучино:119–169 ₽',
'Цена чашки капучино:119–179 ₽', 'Цена чашки капучино:120 ₽',
'Цена чашки капучино:120–140 ₽', 'Цена чашки капучино:120–150 ₽',
'Цена чашки капучино:120–160 ₽', 'Цена чашки капучино:120–170 ₽',
'Цена чашки капучино:120–180 ₽', 'Цена чашки капучино:120–190 ₽',
'Цена чашки капучино:120–200 ₽', 'Цена чашки капучино:120–210 ₽',
'Цена чашки капучино:120–215 ₽', 'Цена чашки капучино:120–220 ₽',
'Цена чашки капучино:120–250 ₽', 'Цена чашки капучино:128–148 ₽',
'Цена чашки капучино:129–169 ₽', 'Цена чашки капучино:129–179 ₽',
'Цена чашки капучино:130 ₽', 'Цена чашки капучино:130–150 ₽',
'Цена чашки капучино:130–160 ₽', 'Цена чашки капучино:130–170 ₽',
'Цена чашки капучино:130–180 ₽', 'Цена чашки капучино:130–190 ₽',
'Цена чашки капучино:130–210 ₽', 'Цена чашки капучино:130–230 ₽',
'Цена чашки капучино:130–250 ₽', 'Цена чашки капучино:139–189 ₽',
'Цена чашки капучино:140–160 ₽', 'Цена чашки капучино:140–170 ₽',
'Цена чашки капучино:140–180 ₽', 'Цена чашки капучино:140–190 ₽',
'Цена чашки капучино:140–200 ₽', 'Цена чашки капучино:140–220 ₽',
'Цена чашки капучино:145–185 ₽', 'Цена чашки капучино:145–200 ₽',
'Цена чашки капучино:145–225 ₽', 'Цена чашки капучино:149–199 ₽',
'Цена чашки капучино:149–219 ₽', 'Цена чашки капучино:149–259 ₽',
'Цена чашки капучино:150 ₽', 'Цена чашки капучино:150–180 ₽',
'Цена чашки капучино:150–190 ₽', 'Цена чашки капучино:150–200 ₽',
'Цена чашки капучино:150–210 ₽', 'Цена чашки капучино:150–219 ₽',
'Цена чашки капучино:150–220 ₽', 'Цена чашки капучино:150–240 ₽',
'Цена чашки капучино:150–245 ₽', 'Цена чашки капучино:150–250 ₽',
'Цена чашки капучино:150–290 ₽', 'Цена чашки капучино:150–320 ₽',
'Цена чашки капучино:155–170 ₽', 'Цена чашки капучино:155–185 ₽',
'Цена чашки капучино:159 ₽', 'Цена чашки капучино:159–200 ₽',
'Цена чашки капучино:160–180 ₽', 'Цена чашки капучино:160–200 ₽',
'Цена чашки капучино:160–210 ₽', 'Цена чашки капучино:160–220 ₽',
'Цена чашки капучино:160–230 ₽', 'Цена чашки капучино:160–250 ₽',
'Цена чашки капучино:160–270 ₽', 'Цена чашки капучино:160–350 ₽',
'Цена чашки капучино:170–190 ₽', 'Цена чашки капучино:170–200 ₽',
'Цена чашки капучино:170–210 ₽', 'Цена чашки капучино:170–220 ₽',
'Цена чашки капучино:170–230 ₽', 'Цена чашки капучино:170–239 ₽',
'Цена чашки капучино:170–250 ₽', 'Цена чашки капучино:179–219 ₽',
'Цена чашки капучино:179–249 ₽', 'Цена чашки капучино:179–275 ₽',
'Цена чашки капучино:179–314 ₽', 'Цена чашки капучино:180–200 ₽',
'Цена чашки капучино:180–210 ₽', 'Цена чашки капучино:180–230 ₽',
'Цена чашки капучино:180–250 ₽', 'Цена чашки капучино:180–300 ₽',
'Цена чашки капучино:184–194 ₽', 'Цена чашки капучино:185–285 ₽',
'Цена чашки капучино:189–269 ₽', 'Цена чашки капучино:190–220 ₽',
'Цена чашки капучино:190–230 ₽', 'Цена чашки капучино:190–240 ₽',
'Цена чашки капучино:190–245 ₽', 'Цена чашки капучино:190–250 ₽',
'Цена чашки капучино:195 ₽', 'Цена чашки капучино:195–245 ₽',
'Цена чашки капучино:195–295 ₽', 'Цена чашки капучино:199–229 ₽',
'Цена чашки капучино:199–285 ₽', 'Цена чашки капучино:200 ₽',
'Цена чашки капучино:200–220 ₽', 'Цена чашки капучино:200–240 ₽',
'Цена чашки капучино:200–250 ₽', 'Цена чашки капучино:200–260 ₽',
'Цена чашки капучино:200–275 ₽', 'Цена чашки капучино:200–300 ₽',
'Цена чашки капучино:200–350 ₽', 'Цена чашки капучино:205–245 ₽',
'Цена чашки капучино:205–280 ₽', 'Цена чашки капучино:210–250 ₽',
'Цена чашки капучино:210–290 ₽', 'Цена чашки капучино:220 ₽',
'Цена чашки капучино:220–240 ₽', 'Цена чашки капучино:220–250 ₽',
'Цена чашки капучино:220–270 ₽', 'Цена чашки капучино:220–280 ₽',
'Цена чашки капучино:220–320 ₽', 'Цена чашки капучино:220–330 ₽',
'Цена чашки капучино:220–350 ₽', 'Цена чашки капучино:230–250 ₽',
'Цена чашки капучино:230–280 ₽', 'Цена чашки капучино:230–290 ₽',
'Цена чашки капучино:230–2907 ₽', 'Цена чашки капучино:230–320 ₽',
'Цена чашки капучино:230–350 ₽', 'Цена чашки капучино:235–335 ₽',
'Цена чашки капучино:239–269 ₽', 'Цена чашки капучино:239–274 ₽',
'Цена чашки капучино:239–279 ₽', 'Цена чашки капучино:240 ₽',
'Цена чашки капучино:249–284 ₽', 'Цена чашки капучино:249–309 ₽',
'Цена чашки капучино:250 ₽', 'Цена чашки капучино:250–270 ₽',
'Цена чашки капучино:250–280 ₽', 'Цена чашки капучино:250–290 ₽',
'Цена чашки капучино:250–300 ₽', 'Цена чашки капучино:250–330 ₽',
'Цена чашки капучино:250–340 ₽', 'Цена чашки капучино:250–350 ₽',
'Цена чашки капучино:250–390 ₽', 'Цена чашки капучино:250–500 ₽',
'Цена чашки капучино:270 ₽', 'Цена чашки капучино:270–280 ₽',
'Цена чашки капучино:275 ₽', 'Цена чашки капучино:279–378 ₽',
'Цена чашки капучино:280–350 ₽', 'Цена чашки капучино:284–299 ₽',
'Цена чашки капучино:285–289 ₽', 'Цена чашки капучино:285–310 ₽',
'Цена чашки капучино:300 ₽', 'Цена чашки капучино:300–350 ₽',
'Цена чашки капучино:50–150 ₽', 'Цена чашки капучино:59–99 ₽',
'Цена чашки капучино:60–100 ₽', 'Цена чашки капучино:60–120 ₽',
'Цена чашки капучино:60–150 ₽', 'Цена чашки капучино:60–180 ₽',
'Цена чашки капучино:60–300 ₽', 'Цена чашки капучино:60–90 ₽',
'Цена чашки капучино:65–140 ₽', 'Цена чашки капучино:69–99 ₽',
'Цена чашки капучино:70–150 ₽', 'Цена чашки капучино:75 ₽',
'Цена чашки капучино:75–150 ₽', 'Цена чашки капучино:80–120 ₽',
'Цена чашки капучино:80–150 ₽', 'Цена чашки капучино:80–160 ₽',
'Цена чашки капучино:80–175 ₽', 'Цена чашки капучино:80–240 ₽',
'Цена чашки капучино:85–350 ₽', 'Цена чашки капучино:89–149 ₽',
'Цена чашки капучино:89–209 ₽', 'Цена чашки капучино:89–229 ₽',
'Цена чашки капучино:90–100 ₽', 'Цена чашки капучино:90–110 ₽',
'Цена чашки капучино:90–130 ₽', 'Цена чашки капучино:90–140 ₽',
'Цена чашки капучино:90–150 ₽', 'Цена чашки капучино:90–158 ₽',
'Цена чашки капучино:90–160 ₽', 'Цена чашки капучино:90–170 ₽',
'Цена чашки капучино:90–180 ₽', 'Цена чашки капучино:90–240 ₽',
'Цена чашки капучино:90–250 ₽', 'Цена чашки капучино:90–98 ₽',
'Цена чашки капучино:90–99 ₽', 'Цена чашки капучино:95 ₽',
'Цена чашки капучино:95–159 ₽', 'Цена чашки капучино:98–150 ₽',
'Цена чашки капучино:99–169 ₽', 'Цена чашки капучино:99–179 ₽',
'Цена чашки капучино:99–180 ₽', 'Цена чашки капучино:99–200 ₽',
'Цена чашки капучино:до 150 ₽', 'Цена чашки капучино:до 179 ₽',
'Цена чашки капучино:от 100 ₽', 'Цена чашки капучино:от 110 ₽',
'Цена чашки капучино:от 120 ₽', 'Цена чашки капучино:от 129 ₽',
'Цена чашки капучино:от 130 ₽', 'Цена чашки капучино:от 139 ₽',
'Цена чашки капучино:от 150 ₽', 'Цена чашки капучино:от 160 ₽',
'Цена чашки капучино:от 169 ₽', 'Цена чашки капучино:от 170 ₽',
'Цена чашки капучино:от 180 ₽', 'Цена чашки капучино:от 200 ₽',
'Цена чашки капучино:от 205 ₽', 'Цена чашки капучино:от 230 ₽',
'Цена чашки капучино:от 250 ₽', 'Цена чашки капучино:от 270 ₽',
'Цена чашки капучино:от 300 ₽', 'Цена чашки капучино:от 60 ₽',
'Цена чашки капучино:от 89 ₽', 'Цена чашки капучино:от 90 ₽', nan],
dtype=object)
Вывод: столбец avg_bill содержит не только данные среднего чека, но и цену бокала пива и чашки капучино. Пропуск в строках категории "кофейня" в большинстве случаев закономерен, так как данные о средней цене чашки кофе содержится в столбце middle_coffee_cup. Данные о цене бокала пива нельзя использовать для заполнения столбца middle_avg_bill, так как они не отражают величину среднего чека в баре/пабе.
#проанализируем аналогично данные в столбце middle_coffee_cup
data['middle_coffee_cup'].sort_values().unique()
array([ 60., 75., 79., 80., 84., 89., 90., 94., 95.,
100., 102., 105., 110., 112., 115., 119., 120., 124.,
125., 127., 129., 130., 134., 135., 137., 138., 139.,
140., 144., 145., 149., 150., 154., 155., 159., 160.,
162., 164., 165., 167., 169., 170., 172., 174., 175.,
179., 180., 184., 185., 189., 190., 195., 197., 199.,
200., 204., 205., 210., 214., 215., 217., 220., 225.,
227., 229., 230., 235., 237., 240., 242., 245., 246.,
250., 254., 255., 256., 259., 260., 265., 266., 270.,
275., 279., 285., 287., 290., 291., 295., 297., 300.,
315., 320., 325., 328., 375., 1568., nan])
Вывод: middle_coffee_cup это число с оценкой одной чашки капучино, которое указано только для значений из столбца avg_bill, начинающихся с подстроки «Цена одной чашки капучино». Если значения нет или оно не начинается с подстроки «Цена одной чашки капучино», то в столбец ничего не входит. Заменять пустые строки средним или медианным значением здесь нецелесообразно. Однако настораживает аномально высокое значение - 1568 в массиве данных.
sns.set(rc={'figure.figsize':(20,6)})
ax = sns.boxplot(x='category', y='middle_coffee_cup', data=data, palette='hls')
plt.title('Распределение цены чашки капучино')
plt.xlabel('Категория заведения')
plt.ylabel('Цена чашки капучино')
plt.show()
#избавимся от выброса (1568) в категории заведения кофейня
data.drop(index=data.query('middle_coffee_cup > 400').index, inplace=True)
#проанализируем данные в столбце seats
sns.set(rc={'figure.figsize':(20,6)})
ax = sns.boxplot(x='category', y='seats', data=data, palette='hls')
plt.title('Распределение количества посадочных мест')
plt.xlabel('Категория заведения')
plt.ylabel('Количество посадочных мест')
plt.show()
Вывод: в столбце seats также много пропусков, заполнение средним или медианным значением по категории заведения вряд ли будет целесообразным. Так как, на величину посадочных мест может влиять является ли оно сетевым и что это за сеть, район расположения, рейтинг заведения.
А вот на величину аномальных значений произведем корректировку. Отбросим все заведения с количеством посадочных мест более 600.
#избавимся от выброса в столбце seats
data.drop(index=data.query('seats > 600').index, inplace=True)
data['street'] = data['address'].str.split(', ').str[1]
data['is_24/7'] = data['hours'].str.contains('ежедневно, круглосуточно')
data.head()
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24/7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | wowфли | кафе | москва, улица дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | нет категории | NaN | NaN | NaN | 0 | NaN | улица дыбенко | False |
| 1 | четыре комнаты | ресторан | москва, улица дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | 0 | 4.0 | улица дыбенко | False |
| 2 | хазри | кафе | москва, клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | 0 | 45.0 | клязьминская улица | False |
| 3 | dormouse coffee shop | кофейня | москва, улица маршала федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | нет категории | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN | улица маршала федоренко | False |
| 4 | иль марко | пиццерия | москва, правобережная улица, 1б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | 1 | 148.0 | правобережная улица | False |
Вывод: в представленном датасете присутствовали и дубликаты, и пропуски. Скрытые дубликаты были удалены. Большое количество пропусков содержалось в столбцах hours, price, avg_bill, middle_avg_bill, middle_coffee_cup, seats. Все они были проанализированы на возможности заполнения медианными или средними показателями.
Также в датасете были найдены аномалии. Для того, чтобы исключить их влияние на анализ данных, аномалии были удалены.
category_name = (
data.groupby(['category'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
category_name.columns = ['category', 'count']
category_name
| category | count | |
|---|---|---|
| 0 | кафе | 2364 |
| 1 | ресторан | 2030 |
| 2 | кофейня | 1400 |
| 3 | бар,паб | 755 |
| 4 | пиццерия | 629 |
| 5 | быстрое питание | 602 |
| 6 | столовая | 313 |
| 7 | булочная | 255 |
# назначаем размер графика
plt.figure(figsize=(20, 6))
# строим столбчатый график средствами seaborn
sns.barplot(x='count', y='category', data=category_name, palette = "hls")
# формируем заголовок графика и подписи осей средствами matplotlib
plt.title('Количество объектов общественного питания по категориям')
plt.xlabel('Количество объектов')
plt.ylabel('Категория объекта')
# отображаем график на экране
plt.show()
Вывод: самая многочисленная категория заведений - кафе, на втором месте - ресторан. Кафе - это, как-правило, заведение с более демократичным ценником, чем ресторан. Кроме того, это заведение может отличать, обширное меню, которое ориентировано на широкую аудиторию. Кофейни находятся на третьем месте по количеству, их на 41% меньше, чем кафе.
На четвертом месте по количеству заведений - бар (755 шт.), на пятом - пиццерия (629 шт.), а на шестом - быстрое питание (602 шт.). Все эти заведения ориентированы на определенную целевую аудиторию, обладают менее обширным меню. Закономерно, что их количество в общем перечне категорий меньше.
Самые малочисленные категории заведений - столовая (313 шт.) и булочная (255 шт.)
#общее количество посадочных мест в категории
category_seats = (
data.groupby(['category'])
.agg({'seats': 'count'})
.sort_values(by='seats', ascending=False)
.reset_index()
)
category_seats.columns = ['category', 'count_seats']
category_seats
| category | count_seats | |
|---|---|---|
| 0 | ресторан | 1257 |
| 1 | кафе | 1205 |
| 2 | кофейня | 738 |
| 3 | бар,паб | 458 |
| 4 | пиццерия | 423 |
| 5 | быстрое питание | 348 |
| 6 | столовая | 162 |
| 7 | булочная | 147 |
# назначаем размер графика
plt.figure(figsize=(20, 6))
# строим столбчатый график средствами seaborn
sns.barplot(x='count_seats', y='category', data=category_seats, palette="hls")
# формируем заголовок графика и подписи осей средствами matplotlib
plt.title('Количество посадочных мест по категориям объектов')
plt.xlabel('Количество посадочных мест')
plt.ylabel('Категория объекта')
# отображаем график на экране
plt.show()
#медианное количество посадочных мест в категории
category_seats = (
data.groupby(['category'])
.agg({'seats': 'median'})
.sort_values(by='seats', ascending=False)
.reset_index()
)
category_seats.columns = ['category', 'median_seats']
category_seats
| category | median_seats | |
|---|---|---|
| 0 | ресторан | 86.0 |
| 1 | бар,паб | 80.0 |
| 2 | кофейня | 78.0 |
| 3 | столовая | 75.0 |
| 4 | быстрое питание | 65.0 |
| 5 | кафе | 60.0 |
| 6 | пиццерия | 52.0 |
| 7 | булочная | 50.0 |
# назначаем размер графика
plt.figure(figsize=(20, 6))
# строим столбчатый график средствами seaborn
sns.barplot(x='median_seats', y='category', data=category_seats, palette="hls")
# формируем заголовок графика и подписи осей средствами matplotlib
plt.title('Медиана посадочных мест в каждой категории объекта')
plt.xlabel('Количество посадочных мест')
plt.ylabel('Категория объекта')
# отображаем график на экране
plt.show()
Вывод: по общему количеству посадочных мест на первое место выходят рестораны (1257 шт.), но кафе от этой категории отстает незначительно (1205 шт.). На третьем месте по прежнему кофейня с 738 посадочными местами.
Если анализировать отдельно взятое заведение в каждой категории, то тут на первом месте по-прежнему ресторан с 86 посадочными местами, а вот на втором - бар (80 мест). Кофейня и здесь на третьем месте с 78 посадочными местами.
А вот в кафе, как-правило, только 60 мест и это лишь 6-е место в общем перечне категорий.
Самые небольшие заведения - пиццерия (52 места) и булочная (50 мест).
Рассмотрите и изобразите соотношение сетевых и несетевых заведений в датасете. Каких заведений больше?
#общее количество посадочных мест в категории
data['chain'] = data['chain'].apply(lambda x: 'сетевое' if x == 1 else 'несетевое')
count_chain = (
data.groupby(['chain'])
.agg({'name': 'count'})
#.sort_values(by='name', ascending=False)
.reset_index()
)
count_chain.columns = ['chain', 'count_chain']
count_chain
| chain | count_chain | |
|---|---|---|
| 0 | несетевое | 5172 |
| 1 | сетевое | 3176 |
# назначаем размер графика
plt.figure(figsize=(20, 6))
# строим столбчатый график средствами seaborn
sns.barplot(x='count_chain', y='chain', data=count_chain, palette='hls')
# формируем заголовок графика и подписи осей средствами matplotlib
plt.title('Количество сетевых и не сетевых заведений')
plt.xlabel('Количество заведений')
plt.ylabel('Тип заведения')
# отображаем график на экране
plt.show()
#Разделим все категории на сетевые и нет
category_chain = (
data.groupby(['category', 'chain'])
.agg({'name': 'count'})
.sort_values(by=['category','name'])
.reset_index()
)
category_chain.columns = ['category', 'chain', 'count']
category_chain
| category | chain | count | |
|---|---|---|---|
| 0 | бар,паб | сетевое | 167 |
| 1 | бар,паб | несетевое | 588 |
| 2 | булочная | несетевое | 99 |
| 3 | булочная | сетевое | 156 |
| 4 | быстрое питание | сетевое | 231 |
| 5 | быстрое питание | несетевое | 371 |
| 6 | кафе | сетевое | 774 |
| 7 | кафе | несетевое | 1590 |
| 8 | кофейня | несетевое | 688 |
| 9 | кофейня | сетевое | 712 |
| 10 | пиццерия | несетевое | 301 |
| 11 | пиццерия | сетевое | 328 |
| 12 | ресторан | сетевое | 721 |
| 13 | ресторан | несетевое | 1309 |
| 14 | столовая | сетевое | 87 |
| 15 | столовая | несетевое | 226 |
sns.barplot(x='count', y='category', data=category_chain, hue='chain', palette='hls')
# формируем заголовок графика и подписи осей средствами matplotlib
plt.title('График соотношения сетевых и несетевых заведений')
plt.xlabel('Количество заведений')
plt.ylabel('Категория заведений')
# выбираем положение легенды и указываем размер шрифта
plt.legend(loc='lower right', fontsize=10)
# добавляем сетку
plt.grid()
# отображаем график на экране
plt.show()
Вывод: общее количество сетевых заведений - 3176 шт., в то время как несетевых - 5172 шт.
При этом, есть две категории, где количество сетевых заведений превышает несетевые - это пиццерии (328 против 301) и кофейни (712 против 688).
В категории кафе и рестораны количество несетевых заведений значительно больше, чем сетевых. Так, в категории кафе, сетевых заведений всего 774, а несетевых в 2 раза больше - 1590. Аналогичная ситуация и с ресторанами: 721 сетевой против 1309 несетевых.
top_chain = data[data['chain'] == 'сетевое']
top_15 = (
top_chain.groupby('name')
.agg({'rating': 'median','district' : 'count', 'category' : pd.Series.mode })
.sort_values('district', ascending = False)
.reset_index()
.head(15)
)
top_15.columns = ['name', 'rating', 'count','category']
top_15
| name | rating | count | category | |
|---|---|---|---|---|
| 0 | шоколадница | 4.20 | 117 | кофейня |
| 1 | домино'с пицца | 4.20 | 76 | пиццерия |
| 2 | додо пицца | 4.30 | 74 | пиццерия |
| 3 | one price coffee | 4.20 | 70 | кофейня |
| 4 | яндекс лавка | 4.00 | 68 | ресторан |
| 5 | cofix | 4.10 | 65 | кофейня |
| 6 | prime | 4.20 | 50 | ресторан |
| 7 | хинкальная | 4.40 | 44 | кафе |
| 8 | кофепорт | 4.20 | 42 | кофейня |
| 9 | теремок | 4.10 | 38 | ресторан |
| 10 | кулинарная лавка братьев караваевых | 4.40 | 38 | кафе |
| 11 | чайхана | 4.10 | 37 | кафе |
| 12 | cofefest | 4.05 | 32 | кофейня |
| 13 | буханка | 4.40 | 32 | булочная |
| 14 | му-му | 4.30 | 27 | кафе |
# строим столбчатую диаграмму
fig = px.bar(top_15.sort_values(by='count', ascending=True), # загружаем данные и заново их сортируем
x='count', # указываем столбец с данными для оси X
y='name', # указываем столбец с данными для оси Y
)
fig.update_layout(title='ТОП-15 сетевых заведений',
xaxis_title='Количество сетевых заведений',
yaxis_title='Наименование заведения',
showlegend = False
)
fig.show()
Вывод: самые популярные сетевые заведения в Москве - "Шоколадница", "Домино'c пицца", "Додо пицца". Одно из них относится к категории кофейня, а два других являются пиццериями.
Наиболее часто встречаемой категорией в сетевых заведенях является именно кофейня. Так, помимо "Шоколадницы", в ТОП-15 входит "One price coffee", "Сofix", кофепорт, "Cofefest".
#общее количество заведений
district_count = (
data.groupby(['district'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
district_count.columns = ['district', 'total_count']
district_count
| district | total_count | |
|---|---|---|
| 0 | Центральный административный округ | 2242 |
| 1 | Южный административный округ | 891 |
| 2 | Северо-Восточный административный округ | 890 |
| 3 | Северный административный округ | 875 |
| 4 | Западный административный округ | 830 |
| 5 | Восточный административный округ | 790 |
| 6 | Юго-Восточный административный округ | 714 |
| 7 | Юго-Западный административный округ | 707 |
| 8 | Северо-Западный административный округ | 409 |
#количество заведений каждой категории по районам
district_category_count = (
data.groupby(['district', 'category'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
district_category_count.columns = ['district', 'category', 'count']
district_category_count
| district | category | count | |
|---|---|---|---|
| 0 | Центральный административный округ | ресторан | 670 |
| 1 | Центральный административный округ | кафе | 464 |
| 2 | Центральный административный округ | кофейня | 428 |
| 3 | Центральный административный округ | бар,паб | 364 |
| 4 | Юго-Восточный административный округ | кафе | 282 |
| ... | ... | ... | ... |
| 67 | Северо-Западный административный округ | бар,паб | 23 |
| 68 | Северо-Западный административный округ | столовая | 18 |
| 69 | Юго-Западный административный округ | столовая | 17 |
| 70 | Юго-Восточный административный округ | булочная | 13 |
| 71 | Северо-Западный административный округ | булочная | 12 |
72 rows × 3 columns
fig = px.bar(district_category_count.sort_values(by='count', ascending=True), x='count',
y='district',
color='category'
)
fig.update_layout(title='Общее количество заведений каждой категории по районам',
xaxis_title='Количество заведений',
yaxis_title='Район местонахождения',
yaxis={'categoryorder':'total ascending'},
width=1000,
height=550
)
fig.show()
Вывод: на графике мы видим, что лидирует по числу заведений Центральный административный округ. Самыми большими категориями здесь являются: рестораны и кафе.
Южный, Северо-Восточный и Северный административный округа имеют примерно равное каоличество заведений ообщественного питания, правда на первом месте здесь кафе, а рестораны только на втором.
Меньше всего заведений общественного питания в Северо-Западном административном округе.
Визуализируйте распределение средних рейтингов по категориям заведений. Сильно ли различаются усреднённые рейтинги в разных типах общепита?
#средний рейтинг по категориям
rating_mean = (
data.groupby(['category'])
.agg({'rating': 'mean'})
.sort_values(by='rating', ascending=False)
.reset_index()
)
rating_mean
| category | rating | |
|---|---|---|
| 0 | бар,паб | 4.390066 |
| 1 | пиццерия | 4.300636 |
| 2 | ресторан | 4.289852 |
| 3 | кофейня | 4.277429 |
| 4 | булочная | 4.267843 |
| 5 | столовая | 4.211821 |
| 6 | кафе | 4.124408 |
| 7 | быстрое питание | 4.049834 |
fig = px.histogram(rating_mean,
x='category',
y='rating',
title='Средний рейтинг по категорям заведений',
nbins=1000)
fig.update_xaxes(title_text='Категория заведения')
fig.update_yaxes(title_text='Рейтинг')
fig.show()
Вывод: рейтинг заведений меняется незначительно от категории к категории. Самую высокую категорию имеют бары (4.39), а самую низкую - быстрое питание (4.05).
rating_district = data.groupby('district', as_index=False)['rating'].agg('mean')
rating_district
| district | rating | |
|---|---|---|
| 0 | Восточный административный округ | 4.174557 |
| 1 | Западный административный округ | 4.180000 |
| 2 | Северный административный округ | 4.240229 |
| 3 | Северо-Восточный административный округ | 4.147978 |
| 4 | Северо-Западный административный округ | 4.208802 |
| 5 | Центральный административный округ | 4.377520 |
| 6 | Юго-Восточный административный округ | 4.101120 |
| 7 | Юго-Западный административный округ | 4.172419 |
| 8 | Южный административный округ | 4.184063 |
# подключаем модуль для работы с JSON-форматом
import json
# читаем файл и сохраняем в переменной
with open('/Users/andreyakimushkin/Downloads/admin_level_geomap.geojson', 'r') as f:
geo_json = json.load(f)
# импортируем карту и хороплет
!pip install folium
from folium import Map, Choropleth
# загружаем JSON-файл с границами округов Москвы
state_geo = '/Users/andreyakimushkin/Downloads/admin_level_geomap.geojson' # читаем файл и сохраняем в переменной
# moscow_lat - широта центра Москвы, moscow_lng - долгота центра Москвы
moscow_lat, moscow_lng = 55.751244, 37.618423
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
geo_data=state_geo,
data=rating_district,
columns=['district', 'rating'],
key_on='feature.name',
fill_color='YlGn',
fill_opacity=0.8,
legend_name='Средний рейтинг заведений по районам',
).add_to(m)
# выводим карту
m
Requirement already satisfied: folium in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (0.16.0) Requirement already satisfied: branca>=0.6.0 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from folium) (0.7.2) Requirement already satisfied: jinja2>=2.9 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from folium) (3.1.2) Requirement already satisfied: numpy in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from folium) (1.24.3) Requirement already satisfied: requests in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from folium) (2.31.0) Requirement already satisfied: xyzservices in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from folium) (2022.9.0) Requirement already satisfied: MarkupSafe>=2.0 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from jinja2>=2.9->folium) (2.1.1) Requirement already satisfied: charset-normalizer<4,>=2 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from requests->folium) (2.0.4) Requirement already satisfied: idna<4,>=2.5 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from requests->folium) (3.4) Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from requests->folium) (1.26.16) Requirement already satisfied: certifi>=2017.4.17 in /Users/andreyakimushkin/anaconda3/lib/python3.11/site-packages (from requests->folium) (2023.7.22)
Вывод: самый высокий рейтинг заведений в Центральном административном округе.
# импортируем карту и маркер
from folium import Map, Marker
# импортируем кластер
from folium.plugins import MarkerCluster
# moscow_lat - широта центра Москвы, moscow_lng - долгота центра Москвы
moscow_lat, moscow_lng = 55.751244, 37.618423
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
# создаём пустой кластер, добавляем его на карту
marker_cluster = MarkerCluster().add_to(m)
# пишем функцию, которая принимает строку датафрейма,
# создаёт маркер в текущей точке и добавляет его в кластер marker_cluster
def create_clusters(row):
Marker(
[row['lat'], row['lng']],
popup=f"{row['name']} {row['middle_avg_bill']}",
).add_to(marker_cluster)
# применяем функцию create_clusters() к каждой строке датафрейма
data.apply(create_clusters, axis=1)
# выводим карту
m
top_15_street = (
data.groupby('street')
.agg({'name': 'count'})
.sort_values('name', ascending = False)
.reset_index()
.head(15)
)
top_15_street.columns = ['street','count']
top_15_street
| street | count | |
|---|---|---|
| 0 | проспект мира | 183 |
| 1 | профсоюзная улица | 122 |
| 2 | ленинский проспект | 107 |
| 3 | проспект вернадского | 97 |
| 4 | дмитровское шоссе | 88 |
| 5 | каширское шоссе | 77 |
| 6 | варшавское шоссе | 76 |
| 7 | ленинградский проспект | 72 |
| 8 | ленинградское шоссе | 70 |
| 9 | мкад | 65 |
| 10 | люблинская улица | 60 |
| 11 | улица вавилова | 55 |
| 12 | кутузовский проспект | 53 |
| 13 | пятницкая улица | 48 |
| 14 | алтуфьевское шоссе | 47 |
#преобразуем столбец в список
top_15_street_list = top_15_street.street.tolist()
top_15_street_list
['проспект мира', 'профсоюзная улица', 'ленинский проспект', 'проспект вернадского', 'дмитровское шоссе', 'каширское шоссе', 'варшавское шоссе', 'ленинградский проспект', 'ленинградское шоссе', 'мкад', 'люблинская улица', 'улица вавилова', 'кутузовский проспект', 'пятницкая улица', 'алтуфьевское шоссе']
top_15_st_cat = data.query("street in @top_15_street_list")
street_category_count = (
top_15_st_cat.groupby(['street', 'category'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
street_category_count.columns = ['street', 'category', 'count']
street_category_count
| street | category | count | |
|---|---|---|---|
| 0 | проспект мира | кафе | 53 |
| 1 | проспект мира | ресторан | 45 |
| 2 | мкад | кафе | 45 |
| 3 | проспект мира | кофейня | 36 |
| 4 | профсоюзная улица | кафе | 35 |
| ... | ... | ... | ... |
| 108 | алтуфьевское шоссе | столовая | 1 |
| 109 | проспект вернадского | булочная | 1 |
| 110 | мкад | столовая | 1 |
| 111 | мкад | бар,паб | 1 |
| 112 | люблинская улица | пиццерия | 1 |
113 rows × 3 columns
fig = px.bar(street_category_count.sort_values(by='count', ascending=True), x='count',
y='street',
color='category'
)
fig.update_layout(#title='Распределение количества заведений и их категорий по ТОП-15 улицам',
xaxis_title='Количество заведений',
yaxis_title='Улица',
yaxis={'categoryorder':'total ascending'},
width=950,
height=600
)
fig.show()
Вывод: в рейтинге ТОП-15 улиц с большим отрывом лидирует Проспект мира. На этой улице находятся преимущественно кафе, рестораны и кофейни.
На втором и третьем месте по количеству заведений в рейтинге ТОП-15 улиц располагаются Профсоюзная улица и Ленинский проспект. Здесь также в рейтинге лидируют кафе и рестораны.
Замыкает ТОП-15 улиц Алтуфьевское шоссе.
street_one = data.groupby(['street', 'district'], as_index = False)['name'].count().query('name==1')
street_one
| street | district | name | |
|---|---|---|---|
| 0 | 1-й автозаводский проезд | Южный административный округ | 1 |
| 1 | 1-й балтийский переулок | Северный административный округ | 1 |
| 2 | 1-й варшавский проезд | Южный административный округ | 1 |
| 3 | 1-й вешняковский проезд | Юго-Восточный административный округ | 1 |
| 5 | 1-й голутвинский переулок | Центральный административный округ | 1 |
| ... | ... | ... | ... |
| 1471 | электрический переулок | Центральный административный округ | 1 |
| 1478 | юго-западный административный округ | Юго-Западный административный округ | 1 |
| 1483 | якиманский переулок | Центральный административный округ | 1 |
| 1484 | яковоапостольский переулок | Центральный административный округ | 1 |
| 1492 | № 7 | Южный административный округ | 1 |
475 rows × 3 columns
one_street_list = street_one.street.tolist()
one_street_list
['1-й автозаводский проезд', '1-й балтийский переулок', '1-й варшавский проезд', '1-й вешняковский проезд', '1-й голутвинский переулок', '1-й грайвороновский проезд', '1-й дербеневский переулок', '1-й земельный переулок', '1-й капотнинский проезд', '1-й кирпичный переулок', '1-й колобовский переулок', '1-й котляковский переулок', '1-й курьяновский проезд', '1-й николощеповский переулок', '1-й новокузнецкий переулок', '1-й рижский переулок', '1-й самотёчный переулок', '1-й сетуньский проезд', '1-й спасоналивковский переулок', '1-й щипковский переулок', '1-я боевская улица', '1-я дубровская улица', '1-я курьяновская улица', '1-я линия хорошёвского серебряного бора', '1-я парковая улица', '1-я стекольная улица', '1-я фрунзенская улица', '1-я ямская улица', '11-я парковая улица', '12-я парковая улица', '14-я парковая улица', '16-я парковая улица', '17-й проезд марьиной рощи', '2-й балтийский переулок', '2-й боткинский проезд', '2-й верхний михайловский проезд', '2-й вышеславцев переулок', '2-й зачатьевский переулок', '2-й квартал капотни', '2-й квартал капотня', '2-й кожуховский проезд', '2-й красносельский переулок', '2-й крестовский переулок', '2-й лучевой просек', '2-й новоподмосковный переулок', '2-й обыденский переулок', '2-й переулок петра алексеева', '2-й полевой переулок', '2-й рощинский проезд', '2-й силикатный проезд', '2-й тверской-ямской переулок', '2-й хорошёвский проезд', '2-й щемиловский переулок', '2-я владимирская улица', '2-я звенигородская улица', '2-я карачаровская улица', '2-я магистральная улица', '2-я пугачёвская улица', '2-я рощинская улица', '2-я рыбинская улица', '2-я улица марьиной рощи', '2-я фрезерная улица', '3-й кадашёвский переулок', '3-й лихачёвский переулок', '3-й михалковский переулок', '3-й новомихалковский проезд', '3-й проезд перова поля', '3-й проезд подбельского', '3-й хорошёвский проезд', '3-я радиаторская улица', '3-я тверская-ямская улица', '3-я фрунзенская улица', '4-й воробьёвский проезд', '4-й лесной переулок', '4-й рощинский проезд', '4-я кабельная улица', '4-я улица 8 марта', '5-й проезд подбельского', '5-я кожуховская улица', '5-я магистральная улица', '5-я улица ямского поля', '6-й лучевой просек', '6-я парковая улица', '9-я улица соколиной горы', 'аллея молодожёнов', 'алтайская улица', 'андреевский пешеходный мост', 'андроньевская площадь', 'анненский проезд', 'арбатский переулок', 'архангельский переулок', 'балакиревский переулок', 'барвихинская улица', 'басманный тупик', 'беговая аллея', 'бесединское шоссе', 'бибиревская улица', 'бобров переулок', 'богословский переулок', 'большая калитниковская улица', 'большая пионерская улица', 'большая серпуховская улица', 'большая тихоновская улица', 'большой волоколамский проезд', 'большой кисловский переулок', 'большой козловский переулок', 'большой николопесковский переулок', 'большой строченовский переулок', 'большой сухаревский переулок', 'большой трёхгорный переулок', 'борисовская улица', 'боровское шоссе', 'ботанический переулок', 'ботанический сад московского государственного университета', 'боярский переулок', 'братеевский парк', 'братиславский парк', 'брянская улица', 'будайский проезд', 'булатниковский проезд', 'бутиковский переулок', 'вагоноремонтная улица', 'валдайский проезд', 'васильевская улица', 'велозаводская улица', 'верхнелихоборская улица', 'верхний сусальный переулок', 'верхняя улица', 'верхоянская улица', 'весёлая улица', 'воробьёвская набережная', 'ворошиловский парк', 'выползов переулок', 'гаврикова улица', 'гагаринский переулок', 'гагаринский тоннель', 'газгольдерная улица', 'гжельский переулок', 'главный ботанический сад имени н.в. цицина российской академии наук', 'глубокий переулок', 'городецкая улица', 'городская улица', 'гороховский переулок', 'графский переулок', 'грузинский сквер', 'гурьевский проезд', 'даев переулок', 'девяткин переулок', 'делегатская улица', 'дендропарковая улица', 'денежный переулок', 'дербеневская улица', 'дмитровский переулок', 'дорогобужская улица', 'дубининская улица', 'дурасовский переулок', 'ереванская улица', 'живарёв переулок', 'жуков проезд', 'загорьевский проезд', 'задонский проезд', 'замоскворецкая линия', 'заозёрная улица', 'зарайская улица', 'звенигородская улица', 'золотая улица', 'зоологическая улица', 'зубарев переулок', 'ивановская улица', 'иваньковское шоссе', 'игарский проезд', 'измайловская площадь', 'инициативная улица', 'казарменный переулок', 'каланчёвская улица', 'калужско-рижская линия', 'каргопольская улица', 'клинская улица', 'коломенская набережная', 'колымажный переулок', 'кольцевая линия', 'коммунистический переулок', 'композиторская улица', 'конюшковская улица', 'кооперативная улица', 'коптевский бульвар д 18 а стр 1', 'костомаровский переулок', 'костромская улица', 'котляковская улица', 'красноармейская улица', 'красностуденческий проезд', 'краснохолмская набережная', 'красноярская улица', 'крылатская улица', 'крылатский мост', 'кубанская улица', 'кузьминская улица', 'курсовой переулок', 'кутузовский проезд', 'лазаревский переулок', 'ландшафтный заказник лианозовский', 'ленинский проспект (дублёр)', 'леонтьевский переулок', 'лечебная улица', 'лианозовский парк культуры и отдыха', 'лианозовский проезд', 'липецкая улица (дублёр)', 'мажоров переулок', 'малая андроньевская улица', 'малая красносельская улица', 'малая почтовая улица', 'малая тульская улица', 'маленковская улица', 'малый гнездниковский переулок', 'малый дровяной переулок', 'малый златоустинский переулок', 'малый ивановский переулок', 'малый казённый переулок', 'малый кисловский переулок', 'малый николопесковский переулок', 'малый патриарший переулок', 'малый толмачёвский переулок', 'мансуровский переулок', 'медовый переулок', 'мерзляковский переулок', 'миусская площадь', 'михайловский проезд', 'мкад', 'молдавская улица', 'москворецкая набережная', 'московская улица', 'московский проспект', 'мурановская улица', 'мытная улица', 'мясницкий проезд', 'нахимовский проспект', 'нащокинский переулок', 'новая улица', 'новгородская улица', 'новомосковская улица', 'новопоселковая улица', 'новороссийская улица', 'новосущёвская улица', 'новощукинская улица', 'новоясеневский тупик', 'одинцовская улица', 'октябрьский переулок', 'ордынский тупик', 'оренбургская улица', 'орловский переулок', 'оршанская улица', 'островная улица', 'отрадный проезд', 'павелецкая набережная', 'панкратьевский переулок', 'парк алтуфьево', 'парк борисовские пруды', 'парк братеевская набережная', 'парк дружбы', 'парк зюзино', 'парк имени артёма боровика', 'парк искусств музеон', 'парк красная пресня', 'парк левобережный', 'парк сад будущего', 'парк технических видов спорта', 'парк тюфелева роща', 'парк этнографическая деревня бибирево', 'парусный проезд', 'певческий переулок', 'переведеновский переулок', 'перекопская улица', 'переулок капранова', 'пермская улица', 'перовский парк культуры и отдыха', 'пестовский переулок', 'петроверигский переулок', 'петровско-разумовская аллея', 'платовская улица', 'площадь журавлёва', 'площадь савёловского вокзала', 'пожарский переулок', 'полоцкая улица', 'померанцев переулок', 'поперечный просек', 'посланников переулок', 'пр-т комсомольский', 'пресненская набережная', 'прибрежный проезд', 'природно-исторический парк измайлово', 'проезд донелайтиса', 'проезд одоевского', 'проезд ольминского', 'проезд якушкина', 'проектируемый проезд № 5265', 'промышленный проезд', 'пронская улица', 'проспект академика сахарова', 'проспект лихачёва', 'просторная улица', 'проточный переулок', 'пулковская улица', 'путевой проезд', 'пушкарёв переулок', 'раушская набережная', 'савёловская линия', 'сад эрмитаж', 'самарская улица', 'самокатная улица', 'светлогорский проезд', 'севастопольский проспект', 'северный бульвар', 'сеченовский переулок', 'симферопольский проезд', 'скатертный переулок', 'сквер имени м.и. калинина', 'скотопрогонная улица', 'смоленская-сенная площадь', 'советская улица', 'солянский тупик', 'софийская набережная', 'средний тишинский переулок', 'ставропольская улица', 'ставропольский проезд', 'старокаширское шоссе', 'староконюшенный переулок', 'старомонетный переулок', 'старый петровско-разумовский проезд', 'старый толмачёвский переулок', 'стахановская улица', 'сторожевая улица', 'стрелецкая улица', 'стромынский переулок', 'ступинский проезд', 'сумская', 'сумской проезд', 'сытинский переулок', 'сытинский тупик', 'таганский парк культуры и отдыха', 'талдомская улица', 'таможенный проезд', 'тарутинская улица', 'таёжная улица', 'терлецкий лесопарк', 'товарищеский переулок', 'токмаков переулок', 'третье транспортное кольцо', 'триумфальная площадь', 'трифоновская улица', 'троилинский переулок', 'трёхпрудный переулок', 'турчанинов переулок', 'тучковская улица', 'тюменский проезд', 'угличская улица', 'ул. профсоюзная', 'ул. ярославская', 'улица 8 марта', 'улица 800-летия москвы', 'улица айвазовского', 'улица академика ильюшина', 'улица академика комарова', 'улица антонова-овсеенко', 'улица артюхиной', 'улица богородский вал', 'улица большая молчановка', 'улица буженинова', 'улица бусиновская горка', 'улица васильцовский стан', 'улица ватутина', 'улица вешних вод', 'улица вильгельма пика', 'улица водников', 'улица всеволода вишневского', 'улица вучетича', 'улица высоцкого', 'улица габричевского', 'улица гастелло', 'улица гашека', 'улица генерала глаголева', 'улица генерала дорохова', 'улица генерала ермолова', 'улица говорова', 'улица годовикова', 'улица грекова', 'улица губкина', 'улица демьяна бедного', 'улица дудинка', 'улица золоторожский вал', 'улица золоторожский вал', 'улица зорге', 'улица ивана франко', 'улица ильинка', 'улица капотня', 'улица кашёнкин луг', 'улица кирпичные выемки', 'улица климашкина', 'улица клочкова', 'улица комдива орлова', 'улица кондратюка', 'улица константина федина', 'улица конёнкова', 'улица костякова', 'улица кутузова', 'улица ленивка', 'улица лефортовский вал', 'улица литвина-седого', 'улица лобачика', 'улица луиджи лонго', 'улица максимова', 'улица малая полянка', 'улица малая якиманка', 'улица маршала баграмяна', 'улица маршала соколовского', 'улица мжд киевское 5-й км', 'улица мусоргского', 'улица неверовского', 'улица николая химушина', 'улица олеко дундича', 'улица острякова', 'улица паустовского', 'улица петра романова', 'улица пивченкова', 'улица поликарпова', 'улица полины осипенко', 'улица раевского', 'улица расковой', 'улица расплетина', 'улица ремизова', 'улица речников', 'улица рогова', 'улица розанова', 'улица рокотова', 'улица россолимо', 'улица садовники', 'улица саляма адиля', 'улица самеда вургуна', 'улица саморы машела', 'улица седова', 'улица симоновский вал', 'улица советской армии', 'улица станиславского', 'улица старые кузьминки', 'улица стасовой', 'улица талалихина', 'улица трофимова', 'улица усиевича', 'улица уткина', 'улица фадеева', 'улица фотиевой', 'улица чечулина', 'улица чистова', 'улица шкулёва', 'улица шкулёва 4', 'улица шухова', 'улица юннатов', 'уссурийская улица', 'федеративный проспект', 'хитровский переулок', 'хлыновский тупик', 'хоромный тупик', 'хохловский переулок', 'центральный парк культуры и отдыха имени м. горького', 'чапаевский переулок', 'челобитьевское шоссе', 'челюскинская улица', 'чермянский проезд', 'черёмушкинский проезд', 'чонгарский бульвар', 'шоссейный проезд', 'электрический переулок', 'юго-западный административный округ', 'якиманский переулок', 'яковоапостольский переулок', '№ 7']
one_street_list_cat = data.query("street in @one_street_list")
street_one_count = (
one_street_list_cat.groupby(['district'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
street_one_count.columns = ['district','count']
street_one_count
| district | count | |
|---|---|---|
| 0 | Центральный административный округ | 211 |
| 1 | Южный административный округ | 83 |
| 2 | Юго-Восточный административный округ | 79 |
| 3 | Северо-Восточный административный округ | 65 |
| 4 | Юго-Западный административный округ | 60 |
| 5 | Восточный административный округ | 54 |
| 6 | Западный административный округ | 54 |
| 7 | Северный административный округ | 54 |
| 8 | Северо-Западный административный округ | 21 |
fig = px.histogram(street_one_count,
x='district',
y='count',
title='Количество улиц, на которых находится по одному заведению. Распределение по округам',
nbins=1000)
fig.update_xaxes(title_text='Наименование округа')
fig.update_yaxes(title_text='Количество улиц')
fig.show()
Вывод: в Центральном административном округе находится больше всего улиц, на которых располагается одно заведение.
median_avg_bill = (
data.groupby(['district'])
.agg({'middle_avg_bill': 'median'})
.sort_values(by='middle_avg_bill', ascending=False)
.reset_index()
)
median_avg_bill
| district | middle_avg_bill | |
|---|---|---|
| 0 | Западный административный округ | 1000.0 |
| 1 | Центральный административный округ | 1000.0 |
| 2 | Северо-Западный административный округ | 700.0 |
| 3 | Северный административный округ | 650.0 |
| 4 | Юго-Западный административный округ | 600.0 |
| 5 | Восточный административный округ | 550.0 |
| 6 | Северо-Восточный административный округ | 500.0 |
| 7 | Южный административный округ | 500.0 |
| 8 | Юго-Восточный административный округ | 450.0 |
# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
geo_data=state_geo,
data=median_avg_bill,
columns=['district', 'middle_avg_bill'],
key_on='feature.name',
fill_color='YlGn',
fill_opacity=0.8,
legend_name='Медианное значение чека по районам',
).add_to(m)
# выводим карту
m
Вывод: в Центральном и Западном административном округе самое большое значение медианного чека - 1000 рублей. Самое низкое значение чека (от 500 рублей и ниже) - в Северо-Восточном, Южном и Юго-Восточном административных округах.
В заведениях общественного питания в Москве по округам, прослеживается тенденция, говорящая о том, что стоимость среднего чека коррелирует со стоимостью недвижимости в каждом из округов, а также со степенью удаленности от центра.
#проанализируем рейтинги, найдем их максимальную и минимальную величину
data['rating'].describe()
count 8348.000000 mean 4.229887 std 0.471085 min 1.000000 25% 4.100000 50% 4.300000 75% 4.400000 max 5.000000 Name: rating, dtype: float64
sns.set(rc={'figure.figsize':(20,7)})
ax = sns.boxplot(x='district', y='rating', data=data, palette='hls')
plt.title('Распределение рейтингов заведений по округам')
plt.xlabel('Наименование округа')
plt.ylabel('Рейтинг')
plt.xticks(rotation=75)
plt.show()
Вывод: рейтинг всех заведений, представленных в датасете относительно высокий. Большинство заведений имеют рейтинг от 5 до 4. Думаю, что в качестве низкого рейтинга, мы можем рассмотреть в том числе и выбросы. Предположим, что в нашем случае низкий рейтинг это то, что ниже значения 3.5.
bad_rating = 3.5
bad_rating_list = data.query('rating <= @bad_rating')
bad_rating_bill = (
bad_rating_list.groupby(['district'])
.agg({'middle_avg_bill': 'median'})
.sort_values(by='middle_avg_bill', ascending=False)
.reset_index()
)
bad_rating_bill
| district | middle_avg_bill | |
|---|---|---|
| 0 | Центральный административный округ | 550.0 |
| 1 | Юго-Восточный административный округ | 525.0 |
| 2 | Южный административный округ | 460.0 |
| 3 | Северо-Западный административный округ | 400.0 |
| 4 | Западный административный округ | 380.0 |
| 5 | Северо-Восточный административный округ | 375.0 |
| 6 | Северный административный округ | 365.0 |
| 7 | Юго-Западный административный округ | 362.5 |
| 8 | Восточный административный округ | 317.5 |
bad_rating_category = (
bad_rating_list.groupby(['category'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
bad_rating_category.columns = ['category','count']
bad_rating_category
| category | count | |
|---|---|---|
| 0 | кафе | 247 |
| 1 | ресторан | 79 |
| 2 | быстрое питание | 73 |
| 3 | кофейня | 49 |
| 4 | бар,паб | 16 |
| 5 | столовая | 16 |
| 6 | пиццерия | 13 |
| 7 | булочная | 10 |
Вывод: величина среднего чека пользователей, поставивших рейтинг заведениям от 3.5 и ниже, значительно меньше, чем среднее значение в каждом из округов.
В категории кафе самое большое количество плохих рейтингов. У ресторанов низкий рейтинг встречается почти в 3 раза реже.
Общий вывод: кафе самая многочисленная категория заведений общественного питания в Москве, на втором месте - ресторан. Кофейни находятся на третьем месте по количеству, их на 41% меньше, чем кафе.
В ресторанах, как-правило, самое большое количество посадочных мест - 86. На втором месте бары с 80 местами. Самые небольшие заведения - пиццерии (52 места) и булочные (50 мест).
Количество сетевых заведений в Москве меньше, чем несетевых (3176 шт. против 5172 шт.). При этом, есть две категории, где количество сетевых заведений превышает несетевые - это пиццерии (328 против 301) и кофейни (712 против 688).
Самые популярные сетевые заведения в Москве - "Шоколадница", "Домино'c пицца", "Додо пицца". Одно из них относится к категории кофейня, а два других являются пиццериями.
Лидирует по числу заведений Центральный административный округ. Самыми большими категориями здесь являются: рестораны и кафе.
Рейтинг заведений меняется незначительно от категории к категории. Самую высокую категорию имеют бары (4.39), а самую низкую - быстрое питание (4.05). Самый высокий рейтинг заведений в Центральном административном округе.
В рейтинге ТОП-15 улиц с самым больщим количеством заведений общественного питания лидирует Проспект мира. На этой улице находятся преимущественно кафе, рестораны и кофейни.
В Центральном и Западном административном округе самое большое значение медианного чека - 1000 рублей. Самое низкое значение чека (от 500 рублей и ниже) - в Северо-Восточном, Южном и Юго-Восточном административных округах.
Пользователи, оставляющие низкий рейтинг заведениям общественного питания, имеют средний чек значительно ниже, чем его медианное значение в округе. Самое большое количество низких рейтингов в категории кафе.
Сколько всего кофеен в датасете? В каких районах их больше всего, каковы особенности их расположения?
#Общее количество кофеен в датасете
data_coffee = data.query('category == "кофейня"')
data_coffee['name'].count()
1400
data_coffee_district = (
data_coffee.groupby(['district'])
.agg({'name': 'count'})
.sort_values(by='name', ascending=False)
.reset_index()
)
data_coffee_district.columns = ['district','count']
data_coffee_district
| district | count | |
|---|---|---|
| 0 | Центральный административный округ | 428 |
| 1 | Северный административный округ | 186 |
| 2 | Северо-Восточный административный округ | 159 |
| 3 | Западный административный округ | 146 |
| 4 | Южный административный округ | 131 |
| 5 | Восточный административный округ | 103 |
| 6 | Юго-Западный административный округ | 96 |
| 7 | Юго-Восточный административный округ | 89 |
| 8 | Северо-Западный административный округ | 62 |
fig = go.Figure(data=[go.Pie(labels=data_coffee_district['district'], # указываем значения, которые появятся на метках сегментов
values=data_coffee_district['count'],
pull = [0.1, 0])]) # добавляем аргумент, который выделит сегмент-лидер на графике
fig.update_layout(title='Число кофеен в округе', # указываем заголовок графика
width=800, # указываем размеры графика
height=600,
annotations=[dict(x=1.39, # вручную настраиваем аннотацию легенды
y=1.05,
text='Наименование округа',
showarrow=False)])
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show() # выводим график
#доля кофеен в процентах от других заведений округа
data_coffee_district['perсent'] = round((data_coffee_district['count']/district_count['total_count'] * 100),0)
data_coffee_district
| district | count | perсent | |
|---|---|---|---|
| 0 | Центральный административный округ | 428 | 19.0 |
| 1 | Северный административный округ | 186 | 21.0 |
| 2 | Северо-Восточный административный округ | 159 | 18.0 |
| 3 | Западный административный округ | 146 | 17.0 |
| 4 | Южный административный округ | 131 | 16.0 |
| 5 | Восточный административный округ | 103 | 13.0 |
| 6 | Юго-Западный административный округ | 96 | 13.0 |
| 7 | Юго-Восточный административный округ | 89 | 13.0 |
| 8 | Северо-Западный административный округ | 62 | 15.0 |
Вывод: Общее количество кофеен в Москве - 1400. Самоее большое количество кофеен в Центральном округе. Меньше всего в Северо-Западном административном округе.
Самая большая доля кофеен от общего числа заведений в Северном административном округе. Самая низкая в Восточном, Юго-Западном и Юго-Восточном административном округе.
#посчитаем количество кофеен, работающих круглосуточно
data_coffee['is_24/7'].value_counts()
is_24/7 False 1326 True 59 Name: count, dtype: int64
#определим, сколько круглосуточных заведений в других категориях
all_time = data.groupby(['category'], as_index = False)['is_24/7'].sum()
all_time
| category | is_24/7 | |
|---|---|---|
| 0 | бар,паб | 52 |
| 1 | булочная | 24 |
| 2 | быстрое питание | 150 |
| 3 | кафе | 266 |
| 4 | кофейня | 59 |
| 5 | пиццерия | 31 |
| 6 | ресторан | 133 |
| 7 | столовая | 12 |
#определим, сколько круглосуточных заведений в других категориях
all_time_total = data.groupby(['category'], as_index = False)['is_24/7'].count()
all_time_total.columns = ['category','total_count']
all_time_total['24_perсent'] = all_time['is_24/7']/all_time_total['total_count'] * 100
all_time_total
| category | total_count | 24_perсent | |
|---|---|---|---|
| 0 | бар,паб | 738 | 7.04607 |
| 1 | булочная | 248 | 9.677419 |
| 2 | быстрое питание | 569 | 26.362039 |
| 3 | кафе | 1994 | 13.34002 |
| 4 | кофейня | 1385 | 4.259928 |
| 5 | пиццерия | 624 | 4.967949 |
| 6 | ресторан | 1958 | 6.792646 |
| 7 | столовая | 304 | 3.947368 |
Вывод: среди кофеен есть те, что работают круглосуточно, но их количество незначительно, всего 4% от общего количества. Это обусловлено прежде всего спросом. Вероятность того, что кофейня будет восстребована круглосуточно, есть только в случае, если она расположена в точках сосредоточения общественного транспорта (вокзалы, аэропорты и пр.)
Самая большая доля круглосуточных заведений общественного питания в категории "быстрое питание".
#определим рейтинги кофеен методом describe()
data_coffee['rating'].describe()
count 1400.000000 mean 4.277429 std 0.373331 min 1.400000 25% 4.100000 50% 4.300000 75% 4.400000 max 5.000000 Name: rating, dtype: float64
#с помощью графика посмотрим как рейтинги распределены по районам
sns.set(rc={'figure.figsize':(20,7)})
ax = sns.boxplot(x='district', y='rating', data=data_coffee, palette='hls')
plt.title('Распределение рейтингов кофеен по округам')
plt.xlabel('Наименование округа')
plt.ylabel('Рейтинг')
plt.xticks(rotation=75)
plt.show()
Вывод: медианное значение рейтинга кофеен по всем округам равно 4.3. Это довольно высокий рейтинг для заведений общественного питания. Самые высокие рейтинги у кофеен в Северном, Западном, Юго-Восточном и Юго-Западном административных округах.
#рассчитаем медианное значение стоимости чашки кофе в разрезе по округам
price_coffee_district = (
data_coffee.groupby(['district'])
.agg({'middle_coffee_cup': 'median'})
.sort_values(by='middle_coffee_cup', ascending=False)
.reset_index()
)
price_coffee_district
| district | middle_coffee_cup | |
|---|---|---|
| 0 | Юго-Западный административный округ | 198.0 |
| 1 | Центральный административный округ | 190.0 |
| 2 | Западный административный округ | 187.0 |
| 3 | Северо-Западный административный округ | 165.0 |
| 4 | Северо-Восточный административный округ | 162.5 |
| 5 | Северный административный округ | 159.0 |
| 6 | Южный административный округ | 150.0 |
| 7 | Юго-Восточный административный округ | 147.5 |
| 8 | Восточный административный округ | 135.0 |
fig = px.histogram(price_coffee_district,
x='district',
y='middle_coffee_cup',
title='Медиана стоимости чашки кофе. Распределение по округам',
nbins=1000)
fig.update_xaxes(title_text='Наименование округа')
fig.update_yaxes(title_text='Стоимость')
fig.show()
Вывод: стоимость чашки кофе колеблется от 198 руб. в Юго-Западном округе до 135 руб. в Восточном округе.
Общий вывод и рекомендации: кофейни довольно популярные заведения в Москве. В каждом из округов данная категория общественного питания на третьем месте.
Рейтинги кофеен довольно высокие, сопоставимые с рейтингами других заведений.
Инвестору можно посоветовать рассмотреть открытие кофейни в Юго-Западном административном округе. В этом округе относительно невысокая доля данной категории заведений 6.86% от числа всех кофеен в Москве и 13% от всех категорий заведений в Юго-Западном округе. Здесь довольно высокий и стабильный рейтинг у кофеен (не опускается ниже 3.5).
Кроме того, самая высокая стоимость 1 чашки кофе (198 руб.) также в Юго-Западном административном округе, что непосредственно влияет на выручку и окупаемость проекта. Однако при этом, стоит уточнить еще затраты, в частности цену аренды помещений, предназначенных для открытия точек общественного питания.
Что касается открытия круглосуточной кофейни, то здесь стоит прежде всего ориентироваться на местоположение будущей точки продаж. Во всех остальных случаях это может обернуться дополнительными убытками.